package main

import "fmt"

/*
   空接口
   golang中的接口可以不定义任何方法，没有定义任何方法的接口就是空接口。空接口表示无任何约束，因此任何类型变量都可以实现空接口
   空接口在实际应用使用的非常多，空接口表示任意数据类型
*/

type A interface{} //空接口  无任何约束 任意的类型都可以实现空接口

func test(a interface{}) { //接受任意类型的参数
	fmt.Printf("a的值：%v,类型：%T\n", a, a)
}

func main() {
	var a A
	var str string = "你好golang"
	a = str                           //表示让字符串实现A接口
	fmt.Printf("值：%#v,类型：%T\n", a, a) //值：你好golang,类型：string

	var num int = 100 //表示让int类型实现A接口
	a = num
	fmt.Printf("值：%#v,类型：%T\n", a, a) //值：100,类型：int

	var flag bool = true
	a = flag                          //表示让bool类型实现A接口
	fmt.Printf("值：%#v,类型：%T\n", a, a) //值：true,类型：bool

	/*
	   空接口表示任意类型
	*/
	var b interface{}
	b = 20
	fmt.Printf("值：%v,类型：%T\n", b, b) //值：20,类型：int
	b = "golang"
	fmt.Printf("值：%v,类型：%T\n", b, b) //值：golang,类型：string
	b = []string{"golang", "hello"}
	fmt.Printf("值：%v,类型：%T\n", b, b) //值：[golang hello],类型：[]string

	test(111)  //a的值：111,类型：int
	test("22") //a的值：22,类型：string
	test('a')  //a的值：97,类型：int32

	slice := []interface{}{1, '2', 3.3, true, "hello", []int{1, 2, 3}, map[string]string{"a": "1"}}
	fmt.Printf("值：%v,类型：%T\n", slice, slice) //值：[1 50 3.3 true hello [1 2 3] map[a:1]],类型：[]interface {}

	var m = make(map[interface{}]interface{})
	m[1] = "1"
	m['0'] = true
	m[3.3] = 'a'
	fmt.Printf("m的值：%v,类型：%T\n", m, m) //m的值：map[3.3:97 1:1 48:true],类型：map[interface {}]interface {}
}
